package com.zhentao.repository;

import com.zhentao.entity.AiConversation;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * AI会话数据访问层
 */
@Repository
public interface AiConversationRepository extends MongoRepository<AiConversation, String> {
    
    /**
     * 根据用户ID和会话ID查找会话
     */
    Optional<AiConversation> findByUserIdAndConversationId(Integer userId, String conversationId);
    
    /**
     * 根据用户ID查找所有活跃会话，按最后消息时间倒序
     */
    @Query("{'userId': ?0, 'status': 'ACTIVE'}")
    Page<AiConversation> findActiveConversationsByUserId(Integer userId, Pageable pageable);
    
    /**
     * 根据用户ID查找所有会话（包括归档的），按最后消息时间倒序
     */
    @Query("{'userId': ?0, 'status': {$ne: 'DELETED'}}")
    Page<AiConversation> findAllConversationsByUserId(Integer userId, Pageable pageable);
    
    /**
     * 根据用户ID查找置顶会话
     */
    @Query("{'userId': ?0, 'status': 'ACTIVE', 'pinned': true}")
    List<AiConversation> findPinnedConversationsByUserId(Integer userId);
    
    /**
     * 根据用户ID和标题搜索会话
     */
    @Query("{'userId': ?0, 'status': {$ne: 'DELETED'}, 'title': {$regex: ?1, $options: 'i'}}")
    Page<AiConversation> findConversationsByUserIdAndTitleContaining(Integer userId, String title, Pageable pageable);
    
    /**
     * 根据用户ID和标签搜索会话
     */
    @Query("{'userId': ?0, 'status': {$ne: 'DELETED'}, 'tags': {$regex: ?1, $options: 'i'}}")
    Page<AiConversation> findConversationsByUserIdAndTagsContaining(Integer userId, String tags, Pageable pageable);
    
    /**
     * 统计用户的活跃会话数量
     */
    @Query(value = "{'userId': ?0, 'status': 'ACTIVE'}", count = true)
    long countActiveConversationsByUserId(Integer userId);
    
    /**
     * 查找需要清理的旧会话（超过指定天数且状态为DELETED）
     */
    @Query("{'status': 'DELETED', 'updateTime': {$lt: ?0}}")
    List<AiConversation> findDeletedConversationsOlderThan(LocalDateTime cutoffTime);
    
    /**
     * 根据会话ID查找会话（不限用户）
     */
    Optional<AiConversation> findByConversationId(String conversationId);
    
    /**
     * 删除用户的所有会话
     */
    void deleteByUserId(Integer userId);
}
